package com.tools.common.object;

import com.tools.common.container.r.OnlyReadMapEntry;

import java.util.Map;

/**
 * 在已有的 API 里通常会对集合容器进行
 * 遍历键值对的操作，这些键值对若需要一些
 * 自定义的增强操作，可以继承该类，覆写
 * force 方法来实现，在返回 ForcePair.Entry
 * 时只需要 super.force ，把经过处理的 Key-Value
 * 作为入参，即可完成返回
 * */
@Note("在已有的 API 里通常会对集合容器进行遍历键值对的操作，" +
        "这些键值对若需要一些自定义的增强操作，可以继承该类，覆写" +
        "force 方法来实现，在返回 ForcePair.Entry 时只需要 super.force ，" +
        "把经过处理的 Key-Value 作为入参，即可完成返回")
public abstract class ForcePair<K, V> extends CustomHandler {

    public ForcePair() {
    }

    public ForcePair(Object parameter) {
        super(parameter);
    }

    public ForcePair(Object... parameters) {
        super(parameters);
    }

    public ForcePair(Iterable parameters) {
        super(parameters);
    }

    @Note("子类继承时覆写该方法，在 return 时 super.force(增强后的 key , 增强后的 value)" +
            "即可完成增强操作。" +
            "当该方法的返回值为 null 时，其结果会被忽略，不会放入容器中。" +
            "所以可以在该类实例化时传入一个 Set<String>，里面是需要忽略的 key。当 set.contain(key) 为 true 时直接 return null" +
            "就可以达到拷贝过程中忽略某些 key-value 的功能。")
    public Map.Entry<K, V> force(K key, V value) {
        return new OnlyReadMapEntry<>(key, value);
    }
}
